home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / ge20.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  5KB  |  211 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include "ge1.h"
  22. #ifdef SET_AND_TEST_LIMITS
  23. afx_overflow()  {
  24.     fprintf(stderr, "Glammar: affix heap overflow.\n\
  25.  Hard Limit was %d bytes.\n\
  26.  Increase with -hn (n=1 = 6Mb, n=2 =12Mb, ...);\n",
  27.      (char *)afx_top - (char *) affix_heap);
  28.     exit(1);
  29. }
  30.   
  31. need_more_qstack()  {
  32.     fprintf(stderr, "Glammar: continuation stack overflow.\n\
  33.  Hard Limit was %d bytes.\n\
  34.  Increase with -qn (n=1 = 100Kb, n=2 =200Kb, ...);\n", q_size);
  35.     exit(1);
  36. }
  37.  
  38. cstore_overflow()  {
  39.     fprintf(stderr, "Glammar: char store overflow.\n\
  40.  Hard Limit was %d bytes.\n\
  41.  Increase with -cn (n=1 = 512Kb, n=2 =1Mb, ...);\n",cstore_top - input);
  42.     exit(1);
  43. }
  44.  
  45. void set_and_test_limits(stk_size, memo_flag)
  46.    int             stk_size,
  47.                    memo_flag;
  48. {
  49.    /* test inputsize */
  50.    if (memo_flag)
  51.          if (nrofchars > runtime_input_size-4 ) {
  52.             fprintf(stderr, "Input size too large (max %d chars)\n",
  53.             runtime_input_size-4);
  54.             exit(1);
  55.          }
  56. }
  57. #endif
  58.  
  59. #ifdef TRACE
  60. char *spaces = "                                "; 
  61. int begin1_trace(ntname)
  62. char           *ntname;
  63. {
  64.   if (interesting_level_number == -1) return level++;
  65.   if (level >= interesting_level_number) {
  66.     int id = (q-q_stack)>>2;
  67.     char *ids = spaces +32 - (id &31);
  68.     if (id >0)
  69.       fprintf(stdout, "%d ",id);
  70.     fprintf(stdout, "%d %s==> %s ", level++,ids, ntname);
  71.     fflush(stdout);
  72.   } else
  73.     level += 1;
  74. }
  75. void begin2_trace() {
  76.   if (interesting_level_number == -1) return;
  77.   if (level > interesting_level_number) {
  78.     if ((ip > limitip) || (ip < input)) 
  79.       fprintf(stdout, " '%c' META\n",*ip);
  80.     else if (*ip != '\0') 
  81.       fprintf(stdout, "%d '%c'\n", ip - input, *ip);
  82.     else
  83.       fprintf(stdout, " EOF\n");
  84.     fflush(stdout);
  85.   }
  86. }
  87.  
  88. int try_trace_list_affix();
  89. void printa ();
  90. void trace_affix(afx)
  91. register AFFIX afx;
  92. {
  93.   if (interesting_level_number == -1) return;
  94.   if (level > interesting_level_number) {
  95.     printf("(");
  96.     if (afx == nil);
  97.     if (try_trace_list_affix(afx));
  98.     else
  99.       printa(stdout, afx);
  100.     printf(") ");
  101.   }
  102. }
  103.  
  104. int try_trace_list_affix(A)
  105. register AFFIX A;
  106. {
  107.   affix   *cell = (affix *) -1;
  108. /*  GET_CELL_ADDR(cell,(A -> t));  */
  109.   if (A == 0) {
  110.     printf("(null)");
  111.     return true;
  112.    }
  113.     { 
  114.         register char *d = (char *) & cell; 
  115.         register char *rc = (A -> t); 
  116.         if ( (rc[0] == '\001') && 
  117.                      (rc[5] == '\001') && 
  118.                      (rc[6] == '\000')) { 
  119.             d[0] = rc [1] ; 
  120.             d[1] = rc [2]; 
  121.             d[2] = rc [3]; 
  122.             d[3] = rc[4]; 
  123.         } else cell = (affix *) -1;
  124.     };
  125.   if ((long) cell != -1) {
  126.     printa(stdout, cell->l);
  127.     printf("*");
  128.     printa(stdout, cell->r);
  129.     return true;
  130.   }
  131.   return false;
  132. }
  133.  
  134.  
  135. begintrace(ntname)
  136. char           *ntname;
  137. {
  138.   if (interesting_level_number == -1) return level++;
  139.   if (level > interesting_level_number) {
  140.     if (*ip != '\0')
  141.       fprintf(stdout, "%d ==> %s %d,%d '%c'\n", level++, ntname, mip - input, ip
  142.           - input, *ip);
  143.     else
  144.       fprintf(stdout, "%d ==> %s EOF\n", level++, ntname);
  145.     fflush(stdout);
  146.   } else
  147.     level += 1;
  148. }
  149.  
  150. endtrace(pct, ntname)
  151. char           *ntname;
  152. int             pct;
  153. {
  154.   if (interesting_level_number == -1) return ;
  155.   if (level > interesting_level_number) {
  156.     int id = (q-q_stack)>>2;
  157.     char *ids = spaces +32 - (id &31);
  158.     if (id >0)
  159.       fprintf(stdout, "%d ",id);
  160.     if (pct == parsecount) {
  161.       if ((ip > limitip) || (ip < input)) 
  162.         fprintf(stdout, "%d %s<-- %s META '%c'\n", --level, ids,ntname,*ip);
  163.       else if (*ip != '\0')
  164.         fprintf(stdout, "%d %s<-- %s %d,%d '%c'\n", --level, ids,ntname, mip -
  165.             input, ip - input, *ip);
  166.       else
  167.         fprintf(stdout, "%d %s<-- %s EOF\n", --level, ids,ntname);
  168.     } else {
  169.       if ((ip > limitip) || (ip < input)) 
  170.         fprintf(stdout, "%d %s<++ %s META '%c'\n", --level, ids,ntname,*ip);
  171.       else if (*ip != '\0')
  172.         fprintf(stdout, "%d %s<++ %s %d,%d '%c'\n", --level,ids, ntname, mip -
  173.             input, ip - input, *ip);
  174.       else
  175.         fprintf(stdout, "%d %s<++ %s EOF\n", --level,ids, ntname);
  176.     }
  177.     fflush(stdout);
  178.   } else
  179.     level -= 1;
  180. }
  181.  
  182. void ambiguous_trace(pct, act, ntname)
  183. char           *ntname;
  184. int            *pct,
  185. *act;
  186. {
  187.   if (*pct < parsecount) {
  188.     if (*act != 0)
  189.       fprintf(stderr, "runtime message: `%s' ambiguous, %d, '%c'\n", ntname, ip
  190.           - input, *ip);
  191.     else
  192.       *act += 1;
  193.     *pct = parsecount;
  194.   }
  195. }
  196. #endif
  197.  
  198. void     result();
  199. #ifdef FOUND
  200. void  found() {
  201.   if (*ip == '\0') {
  202.     parsecount += 1;
  203.     result();
  204.     if (parsecount >= abq_level)
  205.       exit(0);
  206.   }
  207.   q += 1;
  208. }
  209. #endif
  210.  
  211.